﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace RSSP1
{
    class HD_UDP
    {
        /*********************************************************************************************************
        *  @file           HD_UDP.cs
        *  @fn             UDP_GetSocket
        *  @brief          获取UDP Socket对象
        *  @detail         调用函数，输入本地IP端口配置信息，函数将创建Socket对象，并绑定本地IP端口信息
        *  @param[in]      iPEndPoint   本地IP端口配置信息
        *  @param[out]     无
        *  @return         Socket       Socket对象
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static Socket UDP_GetSocket(IPEndPoint iPEndPoint)
        {
            /** Socket信息配置*/
            Socket socket = null;
            /** 创建一个UDP类型的Socket对象*/
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            try
            {
                /** 绑定IP端口信息*/
                socket.Bind(iPEndPoint);
            } 
            catch (Exception e)
            {
                /** 绑定失败，设置无效Socket信息*/
                socket = null;
            }
            /** 返回Socket对象*/
            return socket;
        }

        /*********************************************************************************************************
        *  @file           HD_UDP.cs
        *  @fn             UDP_SetLocIpEndPoint
        *  @brief          设置本端IP端口配置信息
        *  @detail         调用函数，函数根据输入的IP和端口参数，配置到本地配置信息并返回
        *  @param[in]      Ip          本地IP参数信息
        *  @param[in]      Port        本地端口参数信息 
        *  @param[out]     无    
        *  @return         IPEndPoint  本地IP端口配置信息
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static IPEndPoint UDP_SetLocIpEndPoint(String Ip,int Port)
        {
            /** 本地端口信息配置*/
            IPEndPoint LocIpEndPoint = null;
            try
            {
                /** 创建本地端口配置信息*/
                LocIpEndPoint = new IPEndPoint(IPAddress.Parse(Ip), Port);
            }
            catch (Exception e)
            {
                /** 创建失败，设置无效端口配置信息*/
                LocIpEndPoint = null;
            }
            /** 返回本地端口配置信息*/
            return LocIpEndPoint;
        }

        /*********************************************************************************************************
        *  @file           HD_UDP.cs
        *  @fn             UDP_SetRmtIpEndPoint
        *  @brief          设置远程IP端口配置信息
        *  @detail         调用函数，函数根据输入的IP和端口参数，配置到远程配置信息并返回
        *  @param[in]      Ip          远程IP参数信息
        *  @param[in]      Port        远程端口参数信息 
        *  @param[out]     无    
        *  @return         IPEndPoint  远程IP端口配置信息
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static IPEndPoint UDP_SetRmtIpEndPoint(String Ip, int Port)
        {
            /** 远程端口信息配置*/
            IPEndPoint RmtIpEndPoint = null;
            try
            {
                if ("".Equals(Ip.Trim()))
                {
                    /** 创建远程端口配置信息*/
                    RmtIpEndPoint = new IPEndPoint(IPAddress.Any,0);
                }
                else
                {
                    /** 创建远程端口配置信息*/
                    RmtIpEndPoint = new IPEndPoint(IPAddress.Parse(Ip), Port);
                }
            }
            catch (Exception e)
            {
                /** 创建失败，设置无效端口配置信息*/
                RmtIpEndPoint = null;
            }
            /** 返回远程端口配置信息*/
            return RmtIpEndPoint;
        }

        /*********************************************************************************************************
        *  @file           HD_UDP.cs
        *  @fn             UDP_SndData
        *  @brief          UPD数据发送函数
        *  @detail         调用函数，输入Socket对象，发送的远程IP端口信息，待发送的数据，函数将数据发送到指定IP
        *                  端口，并返回实际发送数据长度
        *  @param[in]      Socket           Socket对象
        *  @param[in]      RmtIPEndPoint    远程IP端口配置信息
        *  @param[in]      SndBuffer        待发送数据
        *  @param[out]     无    
        *  @return         int              实际发送数据长度
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static int UDP_SndData(Socket Socket,IPEndPoint RmtIPEndPoint,byte[] SndBuffer,UInt16 SndLen)
        {
            /** 定义发送长度*/
            int RealSndLen = 0;
            try
            {
                /** 发送数据*/
                RealSndLen = Socket.SendTo(SndBuffer, SndLen, SocketFlags.DontRoute,RmtIPEndPoint);
            }
            catch (Exception e)
            {
                /** 发送失败，设置无效发送长度*/
                RealSndLen = 0;
            }
            /** 返回发送数据长度*/
            return RealSndLen;
        }

        /*********************************************************************************************************
        *  @file           HD_UDP.cs
        *  @fn             UDP_RecData
        *  @brief          UPD数据接收函数
        *  @detail         调用函数，输入Socket对象，发送的远程IP端口信息，接收数据缓冲区，函数将接收到的数据放入
        *                  接收缓冲区，并返回接收数据实际长度
        *  @param[in]      Socket           Socket对象
        *  @param[in]      RmtEndPoint      远程端口配置信息
        *  @param[in]      RecBuffer        接收数据缓冲区
        *  @param[out]     无    
        *  @return         int              实际接收数据长度
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static int UDP_RecData(Socket Socket,ref EndPoint RmtEndPoint,ref byte[] RecBuffer)
        {
            /** 定义接收长度*/
            int RecLen = 0;
            try
            {
                /** 接收数据*/
                RecLen = Socket.ReceiveFrom(RecBuffer,ref RmtEndPoint);
            }
            catch (Exception e)
            {
                /** 接收失败，设置无效接收长度*/
                RecLen = 0;
            }
            /** 返回接收数据长度*/
            return RecLen;
        }

        /*********************************************************************************************************
        *  @file           HD_UDP.cs
        *  @fn             UDP_CloseSocket
        *  @brief          关闭Socket资源
        *  @detail         调用函数，输入Socket对象，函数将关闭Socket资源
        *  @param[in]      Socket           Socket对象
        *  @param[out]     无    
        *  @return         无
        *  @author         DUJIANHUA
        *  @date           2021-05-25
        *  @version        V1.0
        *********************************************************************************************************/
        public static void UDP_CloseSocket(Socket Socket)
        {
            /** 参数合法判断*/
            if (null != Socket)
            {
                try
                {
                    /** 关闭资源*/
                    Socket.Close();
                }
                catch (Exception e)
                {
                    ;
                }
            }
        }
    }
}
